Exporting objects in various formats while reporting progress
I would suggest moving the actual export(s) into their own class.  We can create an interface for exports.  Something along the lines of
public interface IExport&lt;T&gt;
{
    Task SaveAsync(string fileName, IEnumerable&lt;T&gt; items, IProgress&lt;int&gt; progress = null);
    string ExportType { get; }
}

Then each export type can implement this interface.
public class ExportItemsToText : IExport&lt;Item&gt;
{
    public Task SaveAsync(string fileName, IEnumerable&lt;Item&gt; items, IProgress&lt;int&gt; progress = null)
    {
        throw new NotImplementedException();
    }

    public string ExportType =&gt; &quot;txt&quot;;
}

Then in your constructor of ExportWindow
public ExportWindow(IEnumerable&lt;IExport&lt;Item&gt;&gt; exports)
{
    // if using DI otherwise could just fill in dictionary here
    ExportStrategy = exports.ToDictionary(x =&gt; x.ExportType, x =&gt; x);
}

Instead of a switch statement you can now just look up the key in the dictionary to find what export should be ran and if not found would be the same as your default case.
IExport&lt;Item&gt; exporter;
if (ExportStrategy.TryGetValue(ext.ToLower(), out exporter))
{
    await exporter.SaveAsync(exportDialog.FileName, items, new Progress&lt;int&gt;(updateProgress))
}
else
{
    throw new Exception(&quot;Specified export format not supported.&quot;);
}

Now in the future if adding support for more types you just implement the interface and update your DI container.  Or if not using DI then would need to add it to the constructor of your ExportWindow.
I don't think this is a great idea but If you really don't want to create a class per export, which I think you should, you could make the dictionary IDictionary&lt;string, Action&lt;string&gt;&gt; then just put your methods in there and when adding a new type create the method and update the dictionary.