You can do USB<->SPI slave with a FT2232H and FTDI’s libftdi USB library. Uart is not desirable because of the more complicated clock timing requirements on both sides of the comm.
The main thing is to put the ftdi device into MPSSE mode instead of uart mode. This allows it to speak SPI.
I wrote a short article about doing this with a fpga acting as SPI slave. You can ignore the fpga part, and see the code at, "Programming the FT2223H using libftdi", http://blog.julian1.io/2017/01/29/icestick-ftdi-spi.html
This is probably the easiest solution (also great tutorial julain1).
It's worth noting however that in this case only a
FT232H (the slightly simpler single channel version of the FT2232H) would be needed. Also that libftdi isn't actually FTDI's library to talk to the chip, it is an open source replacement. FTDI offer their own closed source, but cross platform,
D2XX drivers.
FTDI provide an
app note and
design example, for SPI using the D2XX drivers, as well as
an open source wrapper for D2XX in SPI mode to help you off the ground.
I've used both libftdi, and D2XX in the past, and whilst I prefer libftdi for the community support and open-source codebase. I've found that the D2XX drivers are easier to get going quickly thanks to FTDI's excellent documentation. The whole legacy libftdi, vs up to date libftdi (aka libftdi vs libftdi2), and the libftdi C++ wrapper which seems nice, but I simply could not get to work, does confuse things a bit too!