Я бы не использовал разные формы или панели, так как это, скорее всего, превратит код в большой неосуществимый шарик грязи.
Вместо этого вы можете посмотреть на использование UserControls и динамически загружать то, что будет наиболее подходящим. Это решение будет работать с небольшим количеством элементов управления, однако выйдет из-под контроля, когда будет много событий, сложной логики и поддержания состояния, и я не думаю, что это будет полезно для чего-то другого, кроме небольших проектов.
В 2005 году группа Patterns & Practices внедрила составной прикладной блок пользовательского интерфейса в качестве первой попытки улучшить динамически загружаемые пользовательские элементы управления. Однако это было в значительной степени заброшено после выпуска .NET 3 с Prisim. В ноябре 2010 года была выпущена версия Prisim 4.0 с целью стать скорее стилем архитектуры RIA. Лично я бы выбрал подход Prisim, поскольку здесь есть хорошее сообщество, поддержка со стороны Microsoft и много тяжелой работы, чтобы преодолеть проблемы, с которыми вы, несомненно, столкнетесь.