You would be hard pressed to find anything on ASP.NET that does not work on Mono.

If LINQ to Entity is not supported on Mono, than I'd say there's actually a lot of modern ASP.NET stuff that won't work on Mono.

Also, again, I doubt the graphing API works, since it relies on GDI+, which is probably not implemented in Mono.

The actual ASP.NET MVC 2 code is even distributed with Mono now. The Razor view engine (MVC 3) is not open source but I am serving ASP.NET (using Razor but do not tell) apps served off both OS X and Linux.

The "Do not tell part" suggests to me that you are doing it in violation of one or more licenses. If that is the case, than it is not an option for me. As a commercial company with major clients that could get audited at anytime for software license compliance, I have to keep things on the up and up.

Mono supports .NET 4 applications. Perhaps not every API at this point but it supports everything I have tried.

Again, that's a non-starter for me. If it is not 100% compatible, I can't risk it. Not with the kind of contracts I serve.

Of course, you have been able to use real ORMs like NHibernate

Which isn't as stable as Hibernate for Java yet. And if I'm going to use Mono, but rely on ports of a bunch of popular Java libraries to work around the fact that half the .NET features are missing, then why not just use Java in the first place?

So too with Windows Presentation Foundation. Mono supports GTK# as it's core cross-platform GUI solution. There are several large, complex GUI apps using GTK# to support Linux, Mac, and Windows.

Sorry, but GTK is a joke on Windows and Mac. I have bug reports on file for the Windows port of GTK that are 4 years old and haven't even been assigned to anyone. And when it comes to Mac, the native Aqua port is not production ready. The only production ready port requires X-Windows and produces a very non-native experience. That's a non-starter for most Mac users.

Mono is an extremely capable platform and the core is extremely compatible.

I use a lot more features than just the core. And extremely compatible != 100% compatible. And unless it is 100% compatible, I'm not going to risk it. Again, this is where Java clearly wins. Java is 100% compatible on all platforms that it runs on.

Some of the add-on bits do lag but the only people that care are those that want to use nothing but Microsoft tech and then whine about it not being portable. Who cares?

Again, if you can't use the Microsoft tech, it seems to negate the whole point of using .NET in the first place. When it comes to Linux, Java is a far more mature and stable platform. And it is 100% compatible on every platform it runs on. And if you are going to resort to ports of Java libraries on .NET (such as nHibernate) to make up for the missing functionality, then why not just use Java in the first place?