Typical random encounter table for a location is like this (since these are usually at least partially in Finnish, I am making a fictional one; a short one, to give an example):
gelatinous cube (area 3)
Trogdor (area 20)
4d6 orcs from Black castle with 2d6 humans as sacrifices to Trogdor
event: room 12 finally collapses
event: the larvae in room 23 cocoon
terrain: hill [since the dungeon is in a hilly region, a monster native to hills might wander in]
location: nearby dungeon
event: means what it means. Sometimes, if there are several events, I might have a separate table for events, to which I refer from the random encounter table
terrain: Random monster that might be met in that terrain. A sensible person would just use the terrain-specific tables from their favourite retroclone. I instead have a master table which refers to random tables I have collected and to retroclones with random tables and to whatever else I care to put there.
location: another location nearby, or wherefrom something might wander here
area: the larger geographic or cultural area on a map.
meta: twice: I roll twice and both happen at the same time.
I do not care how long the list is. I just roll some kind of die, maybe d6 or d20 or ask the players to roll any kind of die, apply that entry and move it to the end of the list. If the list is shorter than what I rolled, I start counting again from the beginning. These are stored in a text file, so I can just move entries around and otherwise mess with the table at will. This requires having a laptop.
The system is ergodic, which means that in the long run all the options happen equally often, on average. I do not remember the tables so I do not worry that the first six or however many entries are the only that might happen the next time. The table also gets mixed up as it is used - I might or might not bother doing this by myself, too, so that in the stronghold the frequent encounter with a patrol of 2d6 soldiers will be evenly spaced within the encounter table, rather than all ten instances being at the very beginning.
If the place is almost empty, the cross-references and rolling twice can be unwieldy. In play I might (if pressed for time) simply ignore the cross-references and move to the next fast-to-use encounter. While restocking, they pay off when residents of different areas occasionally interact.
Creating the table requires reading through a module in some detail and writing down the residents. This is a good way of processing the module and hence learning it also for play. If I do not have time, I simply use the default encounter table in the module, or grab some relevant-looking generic encounter table and use that.
Depending on the dungeon, I might or might not keep track of how many creatures of which kind live there. If they are an organized force, keeping track of this is often useful. But if it is a big dungeon with fire beetles in the encounter table, I probably do not bother, unless players take it upon themselves to exterminate or breed them.
Rumour tables work in a similar way, but are simpler. When adding an adventure to the map, I often process it and extract rumours from the adventure background. This requires adapting the history to the game world and thinking more about it and thus leads to developing the game world further.
After a session I might add some entries to the rumour table. After a big even I might go through the table and clean it up, but I also do this lazily - if a clearly obsolete rumour is rolled, I instead tell an updated version of it and alter the one in the records. Or just remove the obsolete one and see what is the next rumour that is still useful.