The problem with your code is that parameters in expressions are compared by reference, not by name. The simplest way to solve this in your case is to use the parameter from the original expression, instead of creating your own:
ParameterExpression param = expression.Parameters.Single();
var lambda = Expression.Lambda<Func<T, bool>>(
Expression.GreaterThanOrEqual(expression.Body, Expression.Constant(date)),
param);