I resolved this issue by setting the binding as the current element in the items source, like this:
<Binding Path="."/>
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type UserControl}}"/>
It looks like the problem is that the IValueConverter is only called when the get/set accessors are called. I was passing the DataGridCell in the binding which is only get/set when scrolling. The contents of the cell is get/set whenever the value changes, so this means the IValueConverter will update accordingly.