Many of you are forgetting something. A major goal of the GNOME project from the very beginning has been to support many languages. This is a cool goal, but hard in reality.
This is (partially) why the base libraries in GNOME are written in C: because it is easy to bind to other languages.
We have tons of language bindings in GNOME (look at http://erik.bagfors.nu/gnome/languages.html), which is great. There are really mature C++, Python and Perl bindings, for example. But this is a lot of work: n languages and m libraries require n*m bindings.
CORBA is one solution. If components are CORBA-enabled, then all you need is an ORB from your language to access that component. Bindings for ORBit, the ORB used by GNOME, are readily available, look at the same language binding matrix linked above. Using CORBA components in late binding languages like Python is extra cool since all you need is the IDL and you have instant access to the interfaces.
But this solution is far from optimal in many situations. CORBA is mostly made for big networked situations, it doesn't scale down well to tiny, inprocess bindings. It is inconvenient to have to deal with IDL, skeletons and stubs.
Here is where the Common Language Infrastructure comes into play. This is the .NET runtime system (CLR) and the Intermediate Language it supports. If this all works out well, we can run code compiled from all kinds of different languages in the same runtime! With the same garbage collector! Objects from language A can seemlessly access objects from language B! (no, not the historical language B. :) ) It will be JITted, so it has great chances of performing really well, too.
This is all what Mono is about, and it is the GNOME dream come true. Whatever your impressions of .NET is, Hailstorm etc., this has nothing at all to do with Mono.
I would like to thank Miguel de Icaza for this initiative.