Doch, man kann auch unter Linux genauso mit Mono Programme sowohl ausführen als auch schreiben und kompilieren. Als IDE sei da z.B. mal MonoDevelop genannt, welches auf SharpDevelop basiert (war ursprünglich nur für C# gedacht, daher der Name). Mit MonoDevelop ist nocht VB.Net hinzugekommen, allerdings wird bislang nur C# voll unterstützt, VB.Net ist da noch nich ganz auf der Linie. Damit lässt sich übrigens auch unter Windows arbeiten, wer keine Lust auf VisualStudio hat (z.B. weil es pervers viel Speicherplatz braucht).
Abgesehn davon braucht man keine IDE, weder für .NET-Sprachen, noch für sonst wie eine Sprache. Die IDE macht nix anderes, als den Sourcecode (welcher eine simple Textdatei ist) zum Compiler weiterreichen und die Compiler sind nix anderes als command line tools.
Zum "Emulieren": Auch bei Windows werden die .NET-Programme nicht direkt ausgeführt. Der Bytecode muss genauso von der CLR interpretiert werden, bei Mono passiert nix anderes (und Java auch nicht). Mag sein, dass die mit Mono ausgeführten Programme etwas länger dauern, als die durch .Net ausgeführten, aber .NET ist auch wesentlich weiter in der Entwicklung. Mono ist ja nicht ein eigenes System, die versuchen ja .NET so gut es geht zu kopieren, denn sowohl der Sourcecode als auch der Bytecode sollen ja identisch sein und identisch behandelt werden. Und wir alle wissen, wie gern Microsoft sich in die Karten schauen lässt
Aber ich rate ebenfalls davon ab unter Linux mit Mono zu arbeiten. Es ist einfach nicht so weit entwickelt wie .NET und über die Stabilität kann ich auch nix sagen. Das würde ich nur in Erwägung ziehen, wenn das Programm plattformunabhängig ausführbar sein soll. Wenn du aber weißt, dass es direkt für Linux geschrieben wird und nie Windows in die Hände fallen wird, dann gleich Linux-like programmieren. Bei Kleinigkeiten sind das meist einfach ganz normale shell-Skripte, ansonsten sind diverse Tools in python geschrieben und C und C++ sind nach wie vor Standardsprachen.
Ansonsten hat Sick das eigentlich ganz gut erklärt. Man programmiert auf der Plattform, auf der ein Programm später laufen soll. Zum einen verhalten sich alle Betriebssysteme unterschiedlich, wie willst du also verhaltensbasierte Fehler finden, wenn du unter einer anderen Plattform entwickelst, als das Programm später laufen soll. Das Testen dauert durch das Verschieben auch viel länger und dazu kommt noch, dass es einem nix bringt, wenn man sich in ein System richtig eingearbeitet hat und ein Programm für ein völlig anderes schreiben will, da die APIs und die Vorgehensweisen völlig unterschiedlich sind. Selbst unter plattformunabhängigen Sprachen, wie Java, ist es nicht immer so, dass die Programme sich immer gleich verhalten und sobald plattformabhängige Sachen hinzu kommen, ist eh Ende. Also die Idee schlag dir mal ganz flott ausm Kopf.