It's rubbish though.
Not the mono runtime; the fact that there are two runtimes.
The official MS one, and the Mono one, and although they're kind of compatible, in that your C# can be compiled to run on either of them (mostly, sometimes, if you haven't done anything fancy, if you're not using MVC, if you're not using a UI layer that isn't portable, if the version of mono you're using from A is the same as from B ( >_> unity...) ), this is FAR away from the java JVM, where you can ship an application that just runs on all the platforms.
Don't get me wrong, you can do that with C# too... if you use Mono only, and flip off the official M$oft .Net runtime.
...but the mono runtime is behind the curve, always playing catchup to the 'official' runtime, supporting a subset of the features, and everywhere runs different versions of the mono runtime. It's a mess.
You've got to admit, the JVM is 100% superior in this regard.