What I have done in the past is this:
Parent (BusinessBase - ROOT)
|--->SelectedChildList (EditableChildList - persisted in the db)
| |-------->SelectedChildItem (EditableChild)
|--->UnselectedChildList (EditableChildList - NOT persisted in the db)
|-------->SelectedChildItem (EditableChild)
I also have a read only list (lets call it ParentItems). When I create or Fetch a Parent object, I fetch the data for Parent and then for SelectedChildList. Then I create a new instance for UnselectedChildlist like this:
UnselectedChildlist = UnselectedChildlist.NewUnselectedChildlist(_selectedChildList);
Within UnselectedChildlist.Create I get my read-only list ParentItems (which is cached if you want it to) and loop through them. If the parameter (SelectedChildList selectedChildList) contains (check with IDs or whatever works) the looped ParentItem then skip, otherwise add to UnselectedChildlist.
You should end up with data populated in SelectedChildList from the DB and also populate your non-persisted UnselectedChildlist to contain all items that have not yet been selected. Then on your UI you have 3 bindingsources, 1 for parent and 1 for each of the selected/unselected lists and bind these to your 2 datagrids.
There are probably better ways of doing this but this is simple and has worked fine for me.
Copyright (c) Marimer LLC