The value you are passing to the last (cbSize) parameter of SendInput() is wrong. It wants you to give it the size of a single TInput, but you are giving it the full size of your entire array instead.
You are also using the wrong TInput field inside of the array. Since you are sending virtual key codes and not hardware scan codes, you should be using the TInput.ki.wVk field rather than the TInput.ki.wScan field.
Try this instead:
class procedure TRoutinesEx.ShiftTab;
var
Inputs: array[0..3] of TInput;
begin
ZeroMemory(@Inputs, SizeOf(Inputs));
Inputs[0].Itype := INPUT_KEYBOARD;
Inputs[0].ki.wVk := VK_SHIFT;
Inputs[1].Itype := INPUT_KEYBOARD;
Inputs[1].ki.wVk := VK_TAB;
Inputs[2].Itype := INPUT_KEYBOARD;
Inputs[2].ki.dwFlags := KEYEVENTF_KEYUP;
Inputs[2].ki.wVk := VK_TAB;
Inputs[3].Itype := INPUT_KEYBOARD;
Inputs[3].ki.dwFlags := KEYEVENTF_KEYUP;
Inputs[3].ki.wVk := VK_SHIFT;
SendInput(Length(Inputs), Inputs[0], SizeOf(TInput));
end;