I suppose, GL.UniformMatrix* (int location, int count, bool transpose, float[] value) should be GL.UniformMatrix* (int location, int count, bool transpose, float[][] value) . It is more convenient.
GL.UniformMatrix* (int location, int count, bool transpose, float[] value)
GL.UniformMatrix* (int location, int count, bool transpose, float[][] value)