No entiendo el siguiente código con shift y or

De hecho dudo que lo estés haciendo correctamente. Si hubieras leído la hoja de datos, notarás que la secuencia correcta es: un byte donde sólo se aplican los 3 bits menos significativos, luego otro donde van 2 bits más significativos (aquí se reciben los bits 8-11 de la lectura analógica) y por último un byte "dummy" (aquí se reciben los primeros 8 bits de la lectura analógica).

En resumen, lo correcto sería:

unsigned int analogSPIRead(byte pin) {
  byte buffer[2];                                                  // Aquí se almacenarán los dos 12 bits de la lectura
  unsigned int* r = (unsigned int*)&buffer;                        // Esto me va a facilitar la conversión de 2 bytes en unsigned int, realmente se usa al final
  byte b1 = B110 | ((pin >> 2) & 1);                               // Aquí va el bit de inicio + modo simple + tercer bit del número de pin a leer
  byte b2 = pin << 6;                                              // Aquí van solo los dos primeros bits del número de pin a leer. Se hacen los más significativos por la forma en que SPI se va a configurar

  pinMode(CS, OUTPUT);                                             // Recuerda que CS es el número de pin donde va el CS del integrado
  SPI.beginTransaction(SPISettings(2000000, MSBFIRST, SPI_MODE0)); // Según la hoja de datos, esta es la configuración recomendada
  digitalWrite(CS, LOW);
  SPI.transfer(b1);                                                // Aquí solo se transmite el primer byte, aún no se recibe nada importante
  buffer[1] = SPI.transfer(b2);                                    // Se transmite el segundo byte, y se reciben los 4 bits más significativos de la lectura
  buffer[0] = SPI.transfer(0);                                     // Realmente no importa lo que se transmite, pero se requiere para los otros 8 bits de la lectura
  digitalWrite(CS, HIGH);
  SPI.endTransaction();                                            // Eso es todo lo que hay que hacer

  buffer[1] &= 0x0F;                                               // Para estar seguros que el valor resultante verdaderamente sea de 12 bits
  return *r;                                                       // ¿Recuerdas cuando declaré a r? Pues para esto era...
}

¿Así sí te sirve? Mira que de antemano ya deberías haber llamado a SPI.begin()