I connected one of the 9x11 LED dot matrix displays to a PIC16F877 microcontroller. To connect all 9 columns and 11 rows, I needed 20 i/o ports on the microcontroller. (Note that this picture is sideways and shows 11 columns and 9 rows.)
Each of the 11 rows is connected, with a resistor, to a port pin. Each of the 9 columns is connected to a transistor, and each transistor is connected to a port pin.
In the PIC code, I specified 18 bytes as the 'FRAME' memory. That is 2 bytes per column. I could have used less memory (1 1/2 bytes per column, or 14 bytes total), but I think that routines to scroll the memory will be easier when each column has its own pair of bytes.
In the 'DisplayFrame' routine I take the data for each column, write it to the ports for the column, then turn on the corresponding column bit. I call a small delay routine, then turn off the column. I do this for each column, and repeat.
Originally I planned on using a PIC16F648 with a technique called 'charlieplexing'. I now believe that charlieplexing can not be used for LED displays that are 'packaged', like all of the dot matrix displays that I know about.
More photos on Flickr