First, yes it is the ElementID, not the DiagramObjectID that is passed to the method. This in itself seems a little backwards to me, since it forces you to do some unnecessary de-referencing to find the DiagramObject in question.
I've tried it all 3 ways now (drag from project, drag from toolbox, right-click on diagram surface and add new). For me, the callback is always invoked, but the state of the diagram is different depending on how I create the new object. I'm doing all of this on an empty drawing.
If I drag an existing object from the project browser, it can at least find it in the diagram; curDiag.SelectedObjects has one thing in it (which is the one I want). So I don't actually have to iterate through the DiagramObjects list to find it. I think it is also the (Count-1)th element in DiagramObjects list.
In the other two case, however, there is nothing in curDiagram.DiagramObjects and nothing in curDiagram.SelectedObjects. They both have a count of 0; it's as if the thing has not yet been created.
To make it worse, it appears that even in the one case where you can get hold of the DiagramObject, you cannot make any changes to its appearance without first saving the diagram. I suspect this is because the API works directly against the database, and not the in-memory model of the diagram.
~Bill