Это классическая причина n-уровневой архитектуры и по большей части большинства шаблонов проектирования, таких как MVC или любой другой дизайн, который отделяет UI (представление) от логики приложения.
Что касается обмена кодом, определенно. Предполагая, что вы используете Visual Studio в моей терминологии, у меня был бы (по крайней мере) один проект специально для толстого клиента, один для веб-клиента, затем несколько проектов для ваших библиотек DLL (создав несколько библиотек DLL, это облегчает повторное использование кода если вам нужен кусок здесь и там). Затем выведите все свои библиотеки DLL в одно и то же место, используя событие посткомпоновки, поэтому при перекомпиляции любого из ваших приложений они всегда самые последние.