I guess menuForEvent: must get called on a subview of NSBrowser, and it must eat it. There doesn't seem to be a clean way to handle this. I can override menuForEvent: on a NSMatrix subclass, if I set a custom matrix class..though that API is deprecated.
What I want to do, is when a user right-clicks, and no column/row is selected, I want nothing to happen (no menu to show). I can be a bit hacky by using validateMenuItem: and hiding everything in there. Doing this isn't great either, because I can right click in a different column than the selected column and the menu will show...since I don't have the NSEvent to check the location of the click against, it seems that I have to add another layer of nasty code by converting the current cursor's position. None of this feels clean.
Edit: Seems that I can set the menu property on each cell in browser:willDisplayCell:atRow:column:
Far as handling right clicks in blank areas and showing an alternative menu depening on what that column is representing, still pretty quirky. Wish there was just a delegate method that allowed me to dynamically change the menu for a given column/row.