The original NES Zelda utilizes a roster protocol for both dungeon enemies and bosses. To wit:
1) Stalfos, Rope, Goriya, WallMaster
2) Gibdo, Pols Voice, Darknut
3) Vire, Like Like, Wizzrobe
Levels 1, 2 and 7 use enemy roster #1. Levels 2, 5 and 8 use enemy roster #2. Levels 4, 6 and 9 use enemy roster #3. Additionally, there's a zeroth "universal" roster containing enemies which can appear in any dungeon: Bubble, Keese, Zol, Gel, Old Man & Traps.
Boss rosters are assigned independently of whatever enemy roster a dungeon utilizes.
i) Aquamentus, Dodongo, Digdogger
ii) Manhandla, Gohma, Gleeok
iii) Ganon (also includes the Patra miniboss)
Levels 1, 2, 5 and 7 use boss roster #1. Levels 3, 4, 6 and 8 use boss roster #2. Level 9 uses boss roster #3.
Enemies (and bosses) can technically be assigned to appear in any room of any dungeon, but they'll appear as graphical gibberish if they aren't on the official roster. That's because the various rosters are really just ways for the game to decide which sprite tiles to assign to PPU. (Over half of the sprite tiles are used for universal stuff like Link, weapons, items, etc. Roughly 25% is devoted to dungeon enemy tiles and the remaining space is used for boss tiles.)
More good news: the graphical gibberish can be overcome via a rather involved process I'm using for my own Zelda hack. First, I upgraded from CHR-RAM to CHR-ROM, as the latter is much easier to work with. I then redesigned new sprite sheets to include either all dungeon enemies -or- all dungeon bosses (minus Ganon). Of course, enemy/boss sprite definitions (the numbers the game uses to call upon/arrange the correct sprite tiles) had to be updated to reflect these new sprite sheets. Finally, I used some unimportant space in one of the six major dungeon room "layers" to identify which particular sprite sheet each room would utilize (enemy vs. boss). Then I updated the routine which calls upon that information to redirect it towards spritesheet selection.