Depende do que você quer. Se você quer trabalhar com o .Net, o Mono é sua melhor aposta. É um clone do .Net que cobre muito do conjunto de recursos desse ambiente. As pessoas constroem sistemas de produção.
O suporte a Java no Linux é muito maduro e o Java no Linux é uma plataforma importante. Entre o Redhat, a Apache Foundation, o Eclipse e vários outros, o suporte a ferramentas de código aberto para Java é bastante strong. O Linux também é uma plataforma de nível 1 para players java comerciais, como Oracle e IBM.
O sistema de idioma e tipo de Java e a JVM são bastante semelhantes ao C # e ao .Net, embora as bibliotecas padrão sejam diferentes. Muitas terceiras bibliotecas de um sistema possuem clones do outro, como o Hibernate e o NHibernate.
Você verá que o suporte a Java no Linux é muito maior que o Mono, portanto, se você quiser desenvolver esse tipo de ambiente no Linux, talvez seja melhor usar o Java. Tendo usado Java e .Net em maior ou menor grau, não acho que seria tão difícil ir de uma plataforma para outra, embora ASP.Net e J2EE tenham diferenças idiomáticas que provavelmente afetarão sua abordagem ao aplicativo. design.
Existe uma VM de software livre chamada Parrot, mas ela não tem muito de um ecossistema em torno dela, da mesma maneira que Java ou .Net.
A maioria das linguagens de código aberto, como o Python, oferece implementações de interpretador nativo ou de compilador JIT, mas elas tendem a ser específicas do idioma. Há também versões de Python, Ruby e várias outras linguagens direcionadas a VMs de terceiros, como o CLR ou JVM. Por exemplo, estão disponíveis implementações de Python de terceiros que visam tanto o CLR (IronPython) quanto a JVM (Jython).
Algumas linguagens como Boo ou Groovy são projetadas especificamente para suportar uma VM específica com recursos de design, como sistemas de tipos criados para essa VM.