I am not an expert in Mono or .NET (far from it), but as I understand it, the problem is that .NET is a 1-to-1 mapping of the Win32 API, including ACLs, kernel locking primitives (Win32 events, mutexes and so on). It appears that the entire .NET is built on top of these primitives, which (in my opinion) leads to a fundamental mismatch.
Some of them are not easy to emulate reliably or efficiently. Look at Wine. For example in Win32 opening a file often enforces a mandatory lock on it.
So, for example, Mono ends up having to manage shared memory areas between independent processes in order to emulate the additional Win32 semantics.
By comparison Java's API is for one much simpler (no even mention of file permissions), and if anything closer in spirit to POSIX.
So, politics aside, that is a purely technical reason that Mono may not be ideal. I would love if someone more knowledgeable commented on it.