Первый вариант звучит великолепно в теории, пока вы не работаете над одним из своих проектов, и вам действительно не захочется реализовать какую-то функцию для полной версии, но вы не можете для компактная версия, потому что она не поддерживает его.
Я бы предложил попытаться отделить весь код "наименьшего общего знаменателя" на отдельные сборки от всего остального. Если вы правильно справляетесь с разделением проблем, у вас может быть внешний интерфейс для ваших полных и компактных проектов, связывая вместе соответствующие сборки в каждом соответствующем внешнем конце.
Тем не менее, я думаю, что это, вероятно, хороший совет: начинать , ориентируясь на компактную структуру. При необходимости используйте разделение проблем, и когда вы дойдете до того момента, когда вам действительно понадобится дополнительная функция в полной версии, тогда пора перейти к двум внешним интерфейсам. Не делай этого, пока тебе это не понадобится, иначе ЯГНИ.