There is no condition around this.bestNode = child;
, so yes it always picks the last of the list.
I may have the logic inversed but it should look something like:
//alpha = Math.Max(alpha, alphaBeta(child, depth - 1, alpha, beta, !max));
int temp = alphaBeta(child, depth - 1, alpha, beta, !max);
if (temp > alpha)
{
this.bestNode = child;
alpha = temp;
}