Не зная, как выглядят ваши формы пользовательского интерфейса, возможно, вы сможете создать базовую форму, в которой все версии имеют общие функциональные возможности. Затем создайте подкласс для форм с определенной функциональностью. Таким образом, вы можете условно компилировать вложенные формы, а не пытаться включать / выключать элементы управления в одной форме. Однако подчиненные формы обычно расширяют форму вниз, поэтому в этом случае переплетение элементов управления по всей форме может не работать.
Также, если вы используете шаблон представления (если вы еще этого не делаете), такой как MVC или MVP, вы можете минимизировать логику, которую вы используете в формах, и передать ее в ведущий / контроллер или даже в бизнес-классы, которые можно настроить на основе на версии, против которой вы компилируете. Эти классы могут вводиться (DI) в приложение в зависимости от конфигурации.
Другой вариант - не компилировать элементы управления формой, а скрыть их в зависимости от используемой версии, но скомпилировать бизнес-классы. Таким образом, важный «интеллектуальный» код отсутствует в приложении, и вы не боретесь с конструктором winform.