Instead of using object task, make your class generic:
class TaskActionMapping<task> where TASK : ??? {
public void Add(TASK task, System.Func<TASK, bool> action) { }
}</task>
For multi-casting, it could work like this: if an action for this key is not in dictionary, new list of delegates is added (better be Queue), if one is already in dictionary, enqueue another delegate to existing queue.
Please see my questions in my comment to the question.