diff --git a/src/TeamsISO.App/Converters/BoolToVisibilityConverter.cs b/src/TeamsISO.App/Converters/BoolToVisibilityConverter.cs
new file mode 100644
index 0000000..fc5cd96
--- /dev/null
+++ b/src/TeamsISO.App/Converters/BoolToVisibilityConverter.cs
@@ -0,0 +1,18 @@
+using System.Globalization;
+using System.Windows;
+using System.Windows.Data;
+
+namespace TeamsISO.App.Converters;
+
+[ValueConversion(typeof(bool), typeof(Visibility))]
+public sealed class BoolToVisibilityConverter : IValueConverter
+{
+ public Visibility TrueValue { get; set; } = Visibility.Visible;
+ public Visibility FalseValue { get; set; } = Visibility.Collapsed;
+
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
+ value is true ? TrueValue : FalseValue;
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
+ throw new NotSupportedException();
+}
diff --git a/src/TeamsISO.App/Converters/EnumDescriptionConverter.cs b/src/TeamsISO.App/Converters/EnumDescriptionConverter.cs
new file mode 100644
index 0000000..00f86ea
--- /dev/null
+++ b/src/TeamsISO.App/Converters/EnumDescriptionConverter.cs
@@ -0,0 +1,52 @@
+using System.Globalization;
+using System.Windows.Data;
+using TeamsISO.Engine.Domain;
+
+namespace TeamsISO.App.Converters;
+
+///
+/// Renders engine enum values into operator-friendly strings.
+///
+public sealed class EnumDescriptionConverter : IValueConverter
+{
+ public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) => value switch
+ {
+ TargetFramerate fr => fr switch
+ {
+ TargetFramerate.Fps23_976 => "23.976 fps",
+ TargetFramerate.Fps24 => "24 fps",
+ TargetFramerate.Fps25 => "25 fps",
+ TargetFramerate.Fps29_97 => "29.97 fps",
+ TargetFramerate.Fps30 => "30 fps",
+ TargetFramerate.Fps50 => "50 fps",
+ TargetFramerate.Fps59_94 => "59.94 fps",
+ TargetFramerate.Fps60 => "60 fps",
+ _ => fr.ToString()
+ },
+ TargetResolution r => r switch
+ {
+ TargetResolution.R720p => "720p",
+ TargetResolution.R1080p => "1080p",
+ TargetResolution.R4K => "4K",
+ _ => r.ToString()
+ },
+ AspectMode a => a switch
+ {
+ AspectMode.Pillarbox => "Pillarbox",
+ AspectMode.Letterbox => "Letterbox",
+ AspectMode.Stretch => "Stretch",
+ _ => a.ToString()
+ },
+ AudioMode m => m switch
+ {
+ AudioMode.Auto => "Auto (isolated → mixed fallback)",
+ AudioMode.Isolated => "Isolated",
+ AudioMode.Mixed => "Mixed",
+ _ => m.ToString()
+ },
+ _ => value
+ };
+
+ public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) =>
+ throw new NotSupportedException();
+}
diff --git a/src/TeamsISO.App/MainWindow.xaml b/src/TeamsISO.App/MainWindow.xaml
index 89319a7..461b7ff 100644
--- a/src/TeamsISO.App/MainWindow.xaml
+++ b/src/TeamsISO.App/MainWindow.xaml
@@ -1,10 +1,159 @@
-
-
-
+ xmlns:vm="clr-namespace:TeamsISO.App.ViewModels"
+ xmlns:conv="clr-namespace:TeamsISO.App.Converters"
+ Title="TeamsISO" Height="700" Width="1100"
+ Background="#202225" Foreground="#E8E8E8">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/TeamsISO.App/MainWindow.xaml.cs b/src/TeamsISO.App/MainWindow.xaml.cs
index d32a3d7..34664bb 100644
--- a/src/TeamsISO.App/MainWindow.xaml.cs
+++ b/src/TeamsISO.App/MainWindow.xaml.cs
@@ -1,4 +1,5 @@
using System.Windows;
+using TeamsISO.App.ViewModels;
namespace TeamsISO.App;
@@ -8,4 +9,9 @@ public partial class MainWindow : Window
{
InitializeComponent();
}
+
+ public MainWindow(MainViewModel viewModel) : this()
+ {
+ DataContext = viewModel;
+ }
}