Прежде всего, неплохо было бы вынести вашу модель в отдельный проект. Как вы обнаружили, это тривиально.
Что касается контроллеров и представлений, я не вижу очевидных преимуществ в их разделении для большинства основных проектов, хотя у вас может быть особая потребность в этом в конкретном приложении.
Если вы все же решите сделать это, вам нужно будет указать фреймворку, как найти ваши контроллеры. Основной способ сделать это - предоставить свой собственный ControllerFactory. Вы можете взглянуть на исходный код DefaultControllerFactory, чтобы понять, как это делается. Подтипа этого класса и переопределения метода GetControllerType (string controllerName) может быть достаточно для выполнения того, о чем вы просите.
Создав свой собственный ControllerFactory, вы добавляете следующую строку в Application_Start в global.asax, чтобы сообщить фреймворку, где его найти:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
Обновление: прочтите этот пост и сообщения, на которые он ссылается, для получения дополнительной информации. См. Также комментарий Фила Хаака к этому сообщению о:
ControllerBuilder.Current.DefaultNamespaces.Add(
"ExternalAssembly.Controllers");
... что не является полным решением, но, возможно, достаточно хорошо для простых случаев.