Too much behind-code for my liking, personally I would create a template for it in resources:
<DataGridTemplateColumn x:Key="booleanImageTemplate">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Name="theImage" Width="64" Height="64" Source="true_image.png"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding theBooleanPropertyName}" Value="False">
<Setter TargetName="theImage" Property="Source" Value="false_image.png"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Then override it on creation:
<Grid>
<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding}" AutoGeneratingColumn="OnAutogeneratingColumn" />
</Grid>
private void OnAutogeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.Column.Header.ToString() == "theBooleanPropertyName")
e.Column = (DataGridTemplateColumn)Resources["booleanImageTemplate"];
}
I've just used an image here (effectively making the column read only) but it would work equally well with a templated checkbox.