SPI is a bus. It has two wires, MOSI and MISO, that allow the MASTER to send data OUT (MOSI) to the bus, and that allow the master to get data IN (MISO) from the bus. That works perfectly when you have one device, the master talks on the MOSI line and the device has that as an input, and writes data back out on the other wire.
Now you want to talk to two devices. How do you do it? Well you have a DIFFERENT wire going to each device, called the Chip Select. When the device sees that line set (ie that chip is “selected”) then it reads the info from the master and is able to send.
So the answer is, yes, each device has to have it’s own CS line. In the case of the music shield, it needs two CS lines, one for “commands” and one for “data”.
the ctor info is useless. Somewhere before these lines:
_dataConfig = new SPI.Configuration((Cpu.Pin)dataCS, false, 0, 0, false, true, 2000, spi, (Cpu.Pin)DREQ, false);
_cmdConfig = new SPI.Configuration((Cpu.Pin)cmdCS, false, 0, 0, false, true, 2000, spi, (Cpu.Pin)DREQ, false);
_dreq = new InputPort((Cpu.Pin)DREQ, false, Port.ResistorMode.PullUp);
you set dataCS and cmdCS and DREQ as cpu.pins, what are their values? Are they wired to the correct pin?