Finally got back to this one. Turns out the problem lies with the collection class I use. The class is derived from ObservableCollection<T>, but it has two type parameters:
public class VmCollection<VM, DM> : ObservableCollection<VM>
The class wraps a domain object (DM) inside a view model object wrapper (VM), then adds the wrapper to its collection.
It seems that the second type parameter causes the WPF DataGrid to become uneditable. The fix is to avoid calling the VmCollection class at run time. Instead, I derive a class for each type of object to be wrapped:
public class FooItemsVm : VmCollection <FooItemVm, FooItem>
The derived class is a simple shell, much like a Repository derived class. Since the class has no typed parameters, it appears to solve the problem.
I have documented the problem and the fix
here. I have also written a
CodeProject article on the wrapper classes, which I am going to update for this fix. Hope this helps someone else down the road!