The apple I would have used raster fonts. All you need to do to create raster fonts is to draw bitmaps of them. This is an actual approach I've seen used; characters are laid in a grid in a BMP file (you could use raw pixel dumps), then your rendering code will simply select the appropriate cell and draw it - how exactly this is done depends on what libraries you are using. You will have to use some libraries unless you're actually writing an entire OS from scratch; no modern desktop OS allows you to directly access hardware without at some point going through some kind of API.
Assembly would have been a common language at the time because compiler technology wasn't quite up to scratch (and didn't even exist on many systems - don't know if the Apple I is among them), but nothing about assembly makes it inherently more suitable for creating characters, actually quite the opposite.
I repeat: there is no "one true way" of creating character sets or fonts. Early systems would have used raster fonts; I know for a fact that IBM PCs stored, somewhere in the hardware, all characters as 8x8 monochrome bitmaps. You would then raise interrupts to change the characters on the screen, which itself was just a grid where each cell would fit one character (you could using interrupts select a cell, set the character as well as fore/background colour). However, no modern operating system renders stuff using interrupts, font rendering is done in software (regardless of whether it's simple monospace raster or fancy OpenType with subpixel smoothing and all the rest). Even on the IBM PC, you could enable graphics mode and do all your text in software (which would have you create your own raster fonts), and I'm sure some programs did do that (games would have had to).