It depends on what you want. If you want to work with .Net, Mono is your best bet. It's a clone of .Net that covers a lot of the feature set of that environment. People build production systems on it.
Java support on Linux is very mature and Java on Linux is a major platform. Between Redhat, the Apache Foundation, Eclipse and various others the open-source tool support for Java is pretty strong. Linux is also a tier-1 platform for commercial java players like Oracle and IBM.
The language and type system of Java and the JVM are quite similar to C# and .Net, although the standard libraries are different. Many third libraries for one sytem have clones on the other, such as Hibernate and NHibernate.
You will find Java support on Linux to be much greater than Mono, so if you want to develop against that type of environment on Linux you might be better off using Java. Having used both Java and .Net to a greater or lesser extent, I don't think it would be that hard to go from one platform to the other, although ASP.Net and J2EE have idiomatic differences that will probably affect your approach to application design.
There is an open source VM called Parrot but it doesn't really have that much of an ecosystem around it in the way that Java or .Net does.
Most open-source lanugages such Python offer native interpreter or JIT compiler implementations, but they tend to be language specific. There are also versions of Python, Ruby and various other languages targeted at third party VMs such as the CLR or JVM. For example, third-party implementations of Python are available that target both the CLR (IronPython) and JVM (Jython).
Some languages such as Boo or Groovy are specifically designed to support a specific VM with design features such as type systems tailored for that VM.