Error "Input is incompatible with <customScalar> type" in mutation with custom scalar parameter

Since your DateTime accepts string values, you can inherit it from TSchemaStringType and implement it like this:

  TSchemaDateTimeType = class(TSchemaStringType)
  strict protected
    function ParseLiteral(Value: TASTValue): TValue; override;
    function GetName: string; override;
    function GetDisplayName: string; override;
  public
    function ParseValue(const Value: TValue): TValue; override;
    function Serialize(const Value: TValue): TValue; override;
  end;

...

{ TSchemaDateTimeype }

function TSchemaDateTimeType.GetDisplayName: string;
begin
  Result := 'DateTime';
end;

function TSchemaDateTimeType.GetName: string;
begin
  Result := 'DateTime';
end;

function TSchemaDateTimeType.ParseLiteral(Value: TASTValue): TValue;
var
  DateValue: TDateTime;
begin
  if Value is TASTStringValue then
  begin
    if not TryISO8601ToDate(TASTSTringValue(Value).Value, DateValue) then
      raise EGraphQLCoercingParseLiteral.Create(Self.DisplayName, Value);
    Result := TValue.From<TDateTime>(DateValue);
  end
  else
    raise EGraphQLCoercingParseLiteral.Create(Self.DisplayName, Value);
end;

function TSchemaDateTimeType.ParseValue(const Value: TValue): TValue;
begin
  if (Value.TypeInfo =  System.TypeInfo(TDateTime)) or
    (Value.TypeInfo =  System.TypeInfo(TDate)) or
    (Value.TypeInfo =  System.TypeInfo(TTime)) then
    Result := Value
  else
    raise EGraphQLCoercingParseValue.Create(Self.DisplayName, Value);
end;

function TSchemaDateTimeType.Serialize(const Value: TValue): TValue;
begin
  if Value.IsEmpty then
    Exit(TValue.Empty);

  if not Value.TryCast(TypeInfo(TDateTime), Result) then
    raise EGraphQLCoercingSerialize.Create(Self.DisplayName, Value);

  Result := DateToISO8601(Value.AsType<TDateTime>, True);
end;

That should do it.