What options are there for programming MCU's in production?
What we do for production, is to first load a program into the PIC that tests out the board (using a small test board that independently verifies the 3.3v rail is within spec using a couple of comparators, and then we use the ADC on the PIC to check everything else out.  We had enough pins left over to allow this (it required some extra resistors to act as voltage dividers for the voltages over 3v).  

After the tests pass, the real production code is flashed into the micro.  Some additional tests are run, and the PCB is ready for assembly into a case.

This is all done via a program on the PC that only requires an operator to connect the board, click one button, and wait for the result PASS/FAIL.  All test results (including ADC readings) are logged.  The entire process (including the programming of the PICs via an ICD 3) is controlled via the PC program, which runs batch scripts to do the actual programming.  Communication to the PIC to control the tests is done via one of the UARTs, whose pins are brought out to the test board (so in addition to the pins required for programming, we also have TX/RX as a minimum).

We set up several stations like this at our contract manufacturer.

BTW the ICD 3 is much faster than the ICD 2 (USB 2.0 vs 1.1).