Every game is different and calls for different annotation approaches, so just like there isn't a program for mapping most games automatically, there isn't one for annotating them. It's theoretically possible to write such programs on a per-game (or, in some cases, per-engine) basis, but generally it's easier and faster to do it manually.
The manual process is generally to screenshot items/NPCs/etc
in situ and add them to the map, typically using the same image editor you used to arrange the map. Some people type out their labels (item names, shops, etc) themselves, but I generally screenshot them from the game, it looks nice and is usually quick to do. I usually keep all this stuff on separate layers, so I can make unlabeled maps easily by hiding those annotation layers.
If you're using an emulator for your screenshots, you may be able to avoid the need to manually remove the backgrounds from the item/etc sprites by using the emulator's VRAM viewer to view the sprites and backgrounds in isolation from one another.
For door and button connections in games where it's not obvious from the map you'll generally want to add some lines showing the connections. The style of these will depend greatly on what you're trying to communicate, and the game's structure and visual style. For example, compare VGCartography's tidy connectors on
Vagrant Story, to the letter indicators on this
Magical Starshine map (which I apparently never submitted to VGMaps, oops), or to the chaos of my
Casper maps. For Casper, I initially roughly hand-drew the connections in different colours as I mapped, and as I finalised the map, I replaced them with vector paths that I applied different brush strokes to.