Strange artifact in writing to serial while executing loop
In your code colors is declared as

rgb_color colors[ledCount];


This means that the very first iteration of this cycle in shiftLED 

for (uint16_t i = ledCount; i &gt; 0; i--)
{
  // access colors[i]
}


will access ledCount[ledCount] which is obviously out of bounds (and will actually write into that location!). The behavior is undefined after that.

Using unsigned types for "backward" array iteration requires a bit of skill. The common idioms are

for (uint16_t i = ledCount; i &gt; 0;)
{
  --i; // do this ASAP

  // access colors[i]
}


or 

for (uint16_t i = ledCount; i-- &gt; 0;)
{
  // access colors[i]
}


or

// Careful: this technique is not usable with unsigned types 
// narrower than `unsigned int`
for (uint16_t i = ledCount - 1; i != -1; --i)
{
  // access colors[i]
}


This is assuming that you want to iterate over the whole array: from [ledCount - 1] all the way back to [0].

But if you intended to iterate back to [1] and stop short of [0] (which is apparently the case), then a simple fix for your cycle would be 

for (uint16_t i = ledCount - 1; i &gt; 0; i--)
{
  // access colors[i]
}


I.e. simply start from ledCount - 1, not from ledCount.