Hola Juan,
La shield I2C que va conectado a la pantalla LCD es un estandar, en el sentido de que han adaptado el chip PCF8574T para conectarlo expresamente a una LCD cualquiera. En las pruebas he utilizado dos LCD azules (fondo azul y píxeles blancos), una de 16x2 y otra de 20x4. Aconsejo utilizar la de 20x4 porque cuando se termina de escribir en una fila, aparece en otra, pero no en orden, el orden es fila 1, 3, 2 y 4.
No puedo decirte qué shield I2C tengo exactamente porque no tiene ninguna referencia, pero te dejo con una imagen de la que estoy utilizando.
Utiliza específicamente el chip PCF8574T si amplías la imagen lo podrás comprobar. Creo que existen chips de versión anterior, en el que su nombre no está la 'T' final o tiene otra letra.
Una vez montado queda así (estoy utilizando una imagen que no es mía)
con los pines de conexión I2C y alimentación justo donde termina la superficie del LCD.
Cuando la shield I2C se conecta a la pantalla LCD queda así:
Vemos que el chip I2C utiliza las salidas P0 a P7, excepto P3. "P3" se utiliza para la retroiluminación (en la imagen no sale pero es así).
Estamos obligados a usar la configuración de 4 bits de datos en la LCD. Por tanto, los datos siempre van a ser el envío de un nibble (4 bits) + control de pines (RS, RW, E y retroiluminación, que son los otros 4 bits). Es decir, vamos a enviar siempre un byte (8 bits), pero dentro de ese byte, 4 bits son de datos, y 4 bits son de control.
El orden de los 8 bits han de ser así, a la izquierda está el bit de mayor peso (MSB):
D3, D2, D1, D0, retroiluminació, Enable, RW, RS
Para hacerlo más sencillo, los bits "retroiluminación" y RW los dejo fijos.
Esta forma de manejar la LCD es... un poco complicada, porque estamos obligados a enviar los datos así, y lo que es peor es que para enviar un comando o escribir un carácter lo hemos de hacer en 4 envíos. ¿Por qué lo hemos de hacer así?
Vamos a ver los 4 pasos en detalle, y vamos a imaginar que quiero enviar la letra "A" que es 41 en hexadecimal, por tanto el nibble alto es 4 y el nibble bajo es 1.
Por otra parte, los bits de control serán así y en este orden (como en binario, MSB a la izquierda)
Retroiluminación (siempre será 1), Enable (este bit lo vamos a controlar), RW (siempre a 0), RS (lo vamos a controlar dependiendo de si es comando o texto)
1) Nibble alto "4" + control (enable=1, RS=1, los demás fijos)
2.) Nibble alto "4" + control (enable=0, RS=1, los demás fijos) En este punto, la LCD toma ese nibble alto, el "4", porque ha "notado" el cambio en el pin enable.
3.) Nibble bajo "1" + control (enable=1, RS=1, los demás fijos)
4.) Nibble bajo "1" + control (enable=0, RS=1, los demás fijos)
RS no es fijo, simplemente RS=1 significa que enviamos un carácter (como en el ejemplo) y no un comando, que en este último entonces pondríamos RS=0.
El módulo que diseñé automatiza todos estos procesos. Para ello utilicé 3 máquinas de contar de 1 bit. Hay dos máquinas de contar que automatiza estos 4 pasos, luego una tercera, también de 1 bits, que se encarga de encarga de la llegada de un dato o comando externo (por ejemplo, desde el puerto serie). Y la última máquina de contar, de 4 bits, sólo se utiliza para la carga de configuración.
El módulo que diseñé funciona perfectamente, el único problema es que al realizar estos 4 pasos y respetar los tiempos de la pantalla LCD, consume mucho tiempo. Lo que me falta por verificar es el pin busy del módulo, porque si se añade módulos de control externos (para convertir el "enter" en un goto xy, por ejemplo) se necesita saber muy bien si podemos ejecutar esa acción o no.
Para finalizar os comento cómo manejar el módulo I2C que está en su interior, es otro diseño nuevo y muchísimo más fácil de manejar. Está pensado para funcionar junto a una máquina de contar.
Si ponemos un dato de 8 bits (d[7:0]) y damos un tic el pin de "send", este módulo enviará ese dato por el I2C, y esto se hace con tantos bytes como queramos y con el tamaño de paquetes de bytes que queramos (es repetir esta acción). Cuando marcamos el pin "stop", el paquete de datos se cierra. El primer byte siempre debe ser la dirección I2C. Si conoce el protocolo I2C, debe saber que con el primer byte que envía, automáticamente se produce la señal de "start" del protocolo I2C (porque es el primero), y cuando haya terminado de enviar datos (de cualquier ancho), le damos un tic en el pin "stop" y crea la señal de "stop" del protocolo I2C.
Para este módulo I2C, la dirección se la trata como cualquier otro dato (no es diferente al resto de datos que envías), por lo que el byte de la dirección (que son 7 bits) hay que multiplicarlo por 2 para sumar el bit RW y formar los 8 bits. No tienes que preocuparte por nada más. El bit ACK del protocolo I2C se agrega dentro del módulo automáticamente.

Para ilustra lo sencillísimo que es hacerlo funcionar os dejo con esta imagen. Se trata de enviar 2 bytes a través del I2C. Para enviar dos bytes necesitamos una máquina de contar de 1 bit, ya que ese bit nos dará 0 y luego 1; estos valores son los que direccionará la tabla. La máquina de contar se encarga de enviar primero "55" y después "AA" y quedará todo como un paquete de 2 bytes con su señal de "start" y "stop" del protocolo I2C. Al terminar el envío, la señal de "done" del módulo I2C nos avisará de que ya está preparado para otro envío. Para cualquier otro paquete de información (2, 8 ó 1000000000 de bytes) se ha de poner una máquina de contar que llegue hasta ese número de envío. Para conseguir paquetes variables, la máquina de contar ha de tener una entrada con límite variable.
Si veis las señales a través de PulseView, el primer byte siempre lo interpreta como dirección, entonces no sale con el valor 55 (en este ejemplo), pero esto no quiere decir que esté mal, sólo que interpreta el byte de dirección como una dirección de 7 bits, en vez de 8.
Saludos!