В принципе, вы описали два способа построения рендеринга SPA: рендеринг на сервере и на клиенте.
У первого подхода минус в большом объеме передаваемых данных, но плюс в простой отрисовке без нагрузки на клиенте (просто заменяем часть дерева DOM той, что пришла с сервера). У второго подхода плюс в меньшем объеме передаваемых данных, но минус в большей манипуляции с деревом DOM, что может сказаться на отзывчивости страницы. Но, например, React и Angular на данный момент работают с так называемым "теневым" или "виртуальным" деревом DOM, когда дерево строится в памяти и просто заменяется, так что второй минус, в принципе, уже и не минус, если использовать эти инструменты.
Ещё есть изоморфный подход к построению SPA: при первом запросе страница рендерится на сервере и отдаётся клиенту, после чего в фоне подгружаются скрипты и дальше все отрисовывается на клиенте, сервер отдаёт только JSON.
Для ASP.NET Core есть готовые шаблоны проектов. Достаточно всего пары команд для создания, например, проекта на основе Angular:
dotnet new --install Microsoft.AspNetCore.SpaTemplates::*
cd <project_folder>
dotnet new angular
Подробнее здесь:
https://blogs.msdn.microsoft.com/webdev/2017/02/14...