Naja,
ich würde dafür einfach eine ganz Normale Klassenbibliothek (Class Library) verwenden. Im Grunde müsstest du die Forms kopieren können, gib aber drauf acht, dass du u.U. noch den Namensraum anpasst. Dann kannst du die Dll referenzieren und das Formular nutzen. Wenn
du jetzt das Formular änderst, kannst du, sofern du von deinem Hauptformular immer noch die selben Methoden mit den selben Parametern und denselben Rückgabetypen aufrufst, einfach die Neue dll in den Ordner der .exe kopieren und das neue Form nutzen. Müsste zumindest so gehen

Ich weiss nicht, worum es in deinem Programm geht, aber ich vermute mal nicht, dass du das ganze unbedingt so geheim halten musst, dass die Leute deine dlls nicht verweden. In den meisten Fällen werden diese eh auf deine Bedürfnisse zugeschnitten sein und den anderen Leuten vermutlich nichts bringen. Wenn du sicher gehen willst, dann gibt es Möglichkeiten, deinen Code zu schützen (z.B. Obfuscatoren).
Das mit den Plugins läuft so:
1) Du schreibst dir ein Interface, dass die Methoden der Plugins deklariert, also wenn du zum Beispiel ein Fenster anzeigen lassen willst, kannst du im Interface eine Methode Show() deklarieren. Plugins verwenden dann dieses Interface und müssen eben diese Show()-Methode implementieren. Die Plugins werden in dlls gespeichert. Um während der Laufzeit diese dlls einzubinden, musst du ein Objekt der Klasse Assemby erzeugen (Namensraum ist System.Reflection) und mit Assembly.LoadFile("meinplugin.dll"); die dll laden. Angenommen, das Objekt heisst meinedll, dann kannst du mit meinedll.GetTypes() die Typen (Klassen) bekommen, die in der dll enthalten sind. Ich hab das dann so gemacht, dass ich versucht habe, die enthaltenen Typen zu meinem Interface zu casten und wenn das ging, dann war das halt ein gültiges Plugin. Wie du an de Dateinamen kommst und wie genau du deine Plugins aufbaust ist natürlich dir überlassen.
Hoffe, ich konnte dir weiterhelfen. Wenn du noch fragen hast, kannste mich auch gerne per pm anschreiben