About timeDelta, as AcidFaucent says it's the same a GameTime.ElapsedTime.TotalSeconds. But most people only use that field of GameTime, so ends up using timeDelta. Also, I don't know how hard/slow is to construct a new GameTime, but a float is just a float, so if you have to use timeDelta*0.25 it's trivial if you're passing a float but not that trivial if you're passing a GameTime.
there are lots and lots of ways to do this, mine is usually like this:
first, I define a "control state"
public bool up,down,left,right;
public bool actionBtn,jumpBtn;
and then, at update I call a function which does something like this (obviously pseudocode)
// reset state
if (userControl is GamePad)
if (userControl is Keyboard)
if (userControl is Mouse)
if (userControl is MindControl)
// to do
I use the OR assignment |= because this way you can combine inputs from Keyboard and Mouse, in example. If you don't want to combine inputs, you can either change it for = and return at the end of each block, or just add "else if"
If you require thumbsticks instead of up/down/left/right, I use a Vector2 where X&Y are the values of the thumbsticks, and you can simulate them in keyboard by setting Vector2.X to -1(left) or 1(right). You can even put code to gradually move from 0 to -1 depending on how long the key has been pressed, but this requires more logic.
Same for pressure triggers, use a float instead of a bool.
So at the end, you have a filled ControlState which you can use it in your game, indepedent of what device control the user is playing with.
Finally, if you require complex motions like quarter circle forward or f,n,d,d/f you can attach a timestamp at the ControlState and log them each frame to later scan and detect these motions, but there are better ways to do that.