Phillip Brittan compares Java and .NET, and puts his finger on Java's problem:
Java takes a language-specific approach to solving problems, .NET takes a platform-specific one
He has some suggestions, and says he'll offer some more - however, opening the JVM to other languages is going to go nowhere until Sun unfreezes the JVM. So long as the JVM sucks as a platform for dynamic languages - which are gaining buzz - the JVM will be seen as a monoculture for one language. Meanwhile, .NET - and Rotor, the cross platform cousin - will adapt and grow to better support dynamic development.