If you don't have to use a view then you should be able to represent this query as a dynamic list that would behave as you would like. As a view I don't think would be able to make this happen. A stored procedure may also be an option, but I usually like to keep most logic in the code and use the DB as a datastore only.
You will have to include the GroupDescription in the aggregate. It didn't appear to be in your example and I added a join to the TimeGroup table.
Give something like this a shot and let us know.
DataAccessAdapter adapter = new DataAccessAdapter();
ResultsetFields fields = new ResultsetFields(6);
fields.DefineField(TimeInputFields.TimeInputGroupID, 0);
fields.DefineField(TimeInputFields.JobID, 1);
fields.DefineField(TimeInputFields.PositionID, 2);
fields.DefineField(TimeInputFields.ChargeoutRate, 3);
fields.DefineField(TimeInputFields.Units, 4, "Hours", AggregateFunction.Sum);
fields.DefineField(TimeGroupFields.GroupDescription, 5);
IRelationPredicateBucket bucket = new RelationPredicateBucket();
bucket.Relations.Add(TimeInputEntity.Relations.TimeInputGroupEntityUsingTimeInputGroupID);
bucket.Relations.Add(TimeInputEntity.Relations.TimesheetEntityusingTimesheetID);
bucket.PredicateExpression.Add(TimesheetFields.TimesheetDate > DateTime.Now);
IGroupByCollection groupByClause = new GroupByCollection();
groupByClause.Add(fields[0]);
groupByClause.Add(fields[1]);
groupByClause.Add(fields[2]);
groupByClause.Add(fields[3]);
groupByClause.Add(fields[5]);
DataTable dynamicList = new DataTable();
adapter.FetchTypedList(fields, dynamicList, bucket, 0, null, true, groupByClause);