Choose a universal Turing machine with $S$ states ($0\leq s < S$) and $C$ colors ($0\leq c< C$) operating on a one-dimensional tape (we'll call stuff relating to this machine "true"). Let us build together a $2$-state Turing machine (states $\text{L}$ and $\text{R}$) with $C+4SC$ colors: the true colors, and "enhanced" colors which carry info about states. We add the constraint that the initial state should be identical to the initial state of the true machine, except possibly for the cell in which we start.
At all times, only the current cell, or the two cells involved in a transition, may have enhanced colors: all other cells have their true color. We want our machine to behave as follows: check what true transition to perform, move the "true state" information from the cell we want to leave to the target cell (this involves a lot of back-and-forth), clean up the cell we left (giving it a true color), repeat.
Before a transition, the current cell has the enhanced color $(c,s)$ encoding the true color, and the true state, and all others have their true color. Look up what transition the true machine would do --- we can assume it is going to the right (flip $\text{L}$ and $\text{R}$ everywhere to go left). Change the enhanced color to $(c_{\text{new}}, s_{\text{new}}, \text{emit})$, move to the right, and change the current state to $\text{L}$.
Then the machine sees a normal color $c$ and is in state $\text{L}$. It changes $c$ to $(c,0, \text{L},\text{receive})$, and goes back left, in state $\text{R}$. We thus have the cells
$$
\cdots \quad c \quad \quad c \quad
(c,s,\text{emit}) \quad (c,0,\text{L},\text{receive})
\quad c \quad c \quad \cdots
$$
where the various true colors are of course independent, but irrelevant. The goal is to move $s$ to the target cell. We do that by decrementing the left state, and incrementing the right state, going back and forth between the two. The end is easy to detect in the left cell ($s$ has become $0$), but harder to detect in the right cell. This is what the $\text{L}$ label is for: as long as the state matches that, continue the decrement/increment loop, but if it does not, we are done, and we clean up.
Here are the transitions to implement that. In almost all cases, move in the direction specified by the current state, then flip the state
$c \to (c,0,\langle dir\rangle,\text{receive})$ where $\langle dir\rangle$ is the current state; move, flip the state.
$(c,s) \to (c_{\text{new}},s_{\text{new}},\text{emit})$ according to the true machine's transitions; ignore current state, set it to the direction in which we want to move; move, flip the state.
$(c,s,\text{emit}) \to (c,s-1,\text{emit})$ for $s>0$; move, flip the state.
$(c,0,\text{emit}) \to c$; move, don't change the state.
$(c,s, \langle dir\rangle, \text{receive}) \to (c, s+1, \langle dir\rangle, \text{receive})$ if the state is $\langle dir\rangle$; move, flip the state.
$(c,s, \langle dir\rangle, \text{receive}) \to (c,s)$ if the state is not $\langle dir\rangle$; don't move, do whatever you like with the state. This could be combined with 2. if you want to always move.
Combining 6 and 2 reduces the number of colors to $C+3SC$. I believe that it is possible to make the initial configuration have no enhanced color at all, but it is probably messy.