Очень просто. Возьмите ContentPresenter или ContentControl.
Положите контент окна, каким он должен быть в начале, в первый UserControl (пусть будет AuthorizationPresentation), а контент, который должен появиться потом — во второй UserControl (MainPresentation).
Заведите себе два VM-класса: AuthorizationVM (для авторизации) и MainVM (для основного контента), а также RootVM:
class RootVM : INotifyPropertyChanged
{
object currentContentVM;
public object CurrentContentVM
{
get => currentContentVM;
set => /* тут имплементация INotifyPropertyChanged */
}
}
Ваш XAML будет выглядеть так:
<Window ...>
<Window.Resources>
<DataTemplate DataType="{x:Type vm:AuthorizationVM}">
<view:AuthorizationPresentation/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:MainVM}">
<view:MainPresentation/>
</DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding CurrentContentVM}"/>
</Window>
Установите DataContext'ом окна экземпляр RootVM.
Теперь вы можете регулировать, какой контент показывается в окне, устанавливая в RootVM свойство CurrentContentVM. Если записать туда экземпляр AuthorizationVM, будет показан AuthorizationPresentation, а если MainVM — то MainPresentation.
Всё!
Небольшое дополнение: а как связать между собой VM? Для этого разные VM должны создаваться не в XAML-коде своего View, а отдельно, в начале программы, которая занимается настройкой всего. Для этого имеет смысл установить точку входа в OnStartup. Примеры того, как переключать VM, тут и тут. Логику приложения, по идее, имеет смысл вынести из OnStartup в корневую VM.