I've pieced together part of the puzzle. From Apple Developer docs:
Controllers require content to manipulate and there are a number of
options for setting this content. It can be done ...
through bindings...
...
NSObjectController and its subclasses are initialized with the method
initWithContent:, passing a content object or nil if you intend to use
the content bindings. You can explicitly set the content of an
existing controller using the setContent: method. It is far more
common to provide content for controllers by establishing a binding to
one of their exposed Controller Content bindings.
NSObjectController exposes a single binding for content called
contentObject. You can establish a binding from contentObject to any
object that is key-value-coding and key-value-observing compliant for
the keys that you intend to have the controller operate on.
From an SO post:
For an NSObjectController, the selection is the content object.
Apparently, the selection @property of the NSObjectController is assigned the contentObject, which is the thing that enables you to do bindings.
More generally:
NSObjectController and its subclasses ... support tracking of the
currently selected object or objects
I think currently selected object must mean the control that is selected in the View.
There are two methods that are commonly used to access the objects
that are currently selected: selection and selectedObjects.
I think that with an NSObjectController, the selected control in the View is meaningless, and therefore the selection @property of the NSObjectController is assigned the contentObject.