This may have slipped by in the D10742 review, but some docs here could be a good place to explain that the list is read-only due to either the contents or the container being owned by the native code.
"... is smaller than..."
Up to here the method is good, but for the actual insertion in the middle of the array we could do this in C (in a helper method in custom_exports_mono) manually instead of C#. Something like efl_mono_eina_array_insert_at(IntPtr array, uint index, IntPtr data)
We would pass to C the result of one of those NativeAlloc<T>(val). If the insert was not successful, we would free it with NativeFree<T>(data).
It would avoid doing unneccessary array relocations with CopyTo.