1) C++ :
Tu ne peux pas faire de Windows Forms en "vrai" C++.
Les Windows Forms est une librairie dotnet (Une technologie ou les logiciel et librairies sont compilées vers du code intermédiaire, comme en java).
Tu peux par contre faire ton appli en C++ natif (Ce sera plus facile pour utiliser ta dll : pas besoin de faire du PInvoke/Marshalling) avec une fenêtre réalisée en Win32 et en utilisant par exemple Code::Blocks/gcc, pour rester consistant avec la dll.
2) C++ Managé :
Le C++ managé est très peu utilisé, et le peu qui l'utilise sont généralement des n00bs qui ont téléchargé Visual Studio express et qui s'en sont servi sans savoir que tout le monde télécharge aussi le platform sdk. Bref, tu trouveras peu d'aide et peu d'exemple.
D'autre part, le C++ managé est du C++ bricolé pour pouvoir être compilé vers le code intermédiaire dotnet, donc c'est pas très jolie.
3) Le C# :
Il est de loin plus adapté au dotnet et aux WinForms vu qu'il a été créé en même temps et pour le dotnet. Par contre, les performances, la portabilité (Machine virtuelle en bonne version requise sur la machine cible), et la facilité d'interfaçage avec la dll ne seront pas au rendez vous (Voir PInvoke).
PS :
Petite question, ta dll linux, tu l'as cross compilée ?