I think I found my issue, or at least a way to handle this without having exceptions be thrown. I modified by XAML code to use an explicit DataGridCollectionViewSource declaration for my grid:
<Control.Resources>
<xcdg:DataGridCollectionViewSource
x:Key="reportResultView"
x:Name="reportResultView"
Source="{Binding SelectedReport.Report.Result.DefaultView}"
AutoCreateItemProperties="True"/>
</Control.Resources>
and then update my DataGridControl to use this as the ItemsSource instead of binding directly to the DataTable:
<xcdg:DataGridControl
Grid.Row="2"
AutoCreateColumns="True"
AutoRemoveColumnsAndDetailConfigurations="True"
ReadOnly="True"
x:Name="xceedReportResult"
ItemsSource="{Binding Source={StaticResource reportResultView}}"
FontSize="11">
<xcdg:DataGridControl.View>
<xcdg:TableflowView
ShowRowSelectorPane="False"
IsAnimatedColumnReorderingEnabled="True"
HorizontalGridLineBrush="LightGray"
VerticalGridLineBrush="LightGray"
IsAlternatingRowStyleEnabled="True"
ShowScrollTip="False">
<xcdg:TableflowView.Theme>
<xcdg:ClassicSystemColorTheme />
</xcdg:TableflowView.Theme>
</xcdg:TableflowView>
</xcdg:DataGridControl.View>
</xcdg:DataGridControl>
Once I do that it no longer throws exceptions if the sorted or grouped column(s) don't exist, and the data grid updates as expected.