Не вижу проблемы, честно говоря. Если вью модель инициализируется во всех окнах одинаково, особенно если автоматически, то можно просто создавать окна и показывать. В зависимости от условий разные.
Пример:
Модель:
namespace MyApp.MyNamespace.ViewModels
{
public class MyWindowModel : INotifyPropertyChanged
{
private object _foo;
public object Foo
{
get { return _foo; }
set { _foo = value; RaisePropertyChanged("Foo"); }
}
...
}
}
Вьюшка:
<Window x:Class="MyApp.MyNamespace.MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels="clr-namespace:MyApp.MyNamespace.ViewModels">
<Window.DataContext>
<viewModels:MyWindowModel x:Key="Model" />
</Window.DataContext>
<Grid>
<TextBlock Text={Binding Foo} />
</Grid>
</Window>
Вызывать можно так, например как вы говорите из окошка логина:
...
// проверяем успешность логина
if (!loginSuccess)
return;
// если всё хорошо, то создаём новое окно
var myWindow = new MyWindow();
// если нужно - что-то делаем с моделью внутри окна
var model = myWindow.DataContext as MyWindowModel;
model.Foo = new object();
// показываем новое окно
myWindow.Show();
// закрываем текущее окно логина
var window = Application.Current.Windows[0];
if (window != null)
window.Close();