Nunca intenté armar un programador para PICs, otra gente del foro puede tener experiencia con esto.
El programador lo que hace es recibir el mapa de memoria del pic que se desea (que es enviado a través de un software por la PC), utilizar las líneas PGC/PGD del pic a programar como una interfaz serie para enviar comandos de lectura de memoria, borrado, escritura, inicio de programación, etc.
Al modo de programación se entra aplicando la "alta tensión" en la pata MCLR.
Ese mapa de memoria se genera al compilar el código fuente, y está en el archivo .hex generado (no es un mapa de memoria literal, responde a un formato estandar de Intel blablabla).
El detalle de los comandos, timing, recursos utilizados, etc se puede consultar entrando en la página del producto, supongamos el pic18f14k50:
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en533924
Abajo en "documentation & software" hay que bajar el pdf bajo "Programming specifications".
Otra cuestión importante!!!!!, no hay que energizar las patas PGC y PGD con más de 3.3V (porque de esas patas también está colgado internamente el módulo usb que admite 3.3V máximo).
Eso lo incorpora el "header": un traductor de nivel para las patas PGC y PGD.
No lo tenía presente porque en mi caso no lo precisaba:
No sé si puede hacer con el pickit2, pero con el icd2 (otro programador/depurador más arcaico que el pickit2) lo que yo hacía era configurar que el programador tomara energía de la placa, y no que el programador energice la placa.
De hecho encontré un post mío en el foro de microchip del 2009

:
https://www.microchip.com/forums/tm.aspx?m=436969&high=pic18f14k50+icd2
Me terminé respondiendo yo solo, jaja.
En fin, lo que hacía era alimentar la placa donde está el pic con 3.3V, configurar que el programador icd2 tome energía de la misma placa del pic, y usar los zeners para limitar el Vpp aplicado al MCLR del pic.
Para terminar, la forma de programar los pics depende de la familia (16F, 18F, etc) y a veces hasta del modelo. Y usan su propio protocolo que denominan ICSP.
Otros fabricantes de micros (Texas, micros ARM de 32 bits de ST, NXP, etc) lo que hacen es usar una interfaz estandar JTAG que - si bien no era la intención original programar/depurar micros - terminó usandose para eso. JTAG no tiene de por sí todos los comandos definidos para esa tarea, es similar a lo que pasa con una comunicación serie RS-232, cada uno termina definiendo su propio protocolo por encima del nivel de "enviar byte" y "recibir byte", aunque JTAG creo que está un poco más arriba en el nivel de "escribir registro" y "leer registro". En fin...
Pero todos tienen sus propios "secretos", nunca me puse a ver cual era el que hacía todo open source, desconozco si hay alguno que sea 100% transparente y abierto.
Otra cuestión útil que sirve para programar los micros es cuando estos vienen con un bootloader, con lo que no hace falta un programador para el micro sino que se le puede enviar el programa por USB/SPI/I2C/UART (algunos micros con más recursos pueden leer el programa desde una tarjeta SD conectada al micro por ejemplo).
Pero claro, al bootloader hay que programarlo cuando el chip viene vacío, y para eso sí hace falta un programador :cabezon:
Bueno, demasiado largo el asunto. Acordate de adaptar los niveles PGC y PGD también (a menos que puedas configurar el pickit2 para que tome alimentación de la placa como hacía yo con el icd2).