I think you found a CLR bug. There are two fundamentally different chunks of code that binds a delegate, BindToMethodInfo and BindToMethodName. They are quite painful to unravel due to the caching that occurs inside them, I'm guessing there's something wrong there and related to the fact that arrays are treated rather specially in .NET.
That this hasn't been noticed before is somewhat explainable, surely everybody that tried to do what you do is using the documented Array.GetValue() method. Like this:
var method = typeof(string[,]).GetMethod("GetValue",
new Type[] { typeof(int), typeof(int) });
var func = Delegate.CreateDelegate(typeof(Func<int, int, object>),
new string[4, 5], method);
Which works fine. You can post feedback at connect.microsoft.net to hear the experts' opinion, don't count on a quicky bug fix though.