In theory:
If an object implements Close or Dispose, it does so because it holds an expensive, shared, native resource that should be released as soon as possible.

In real life:
I do agree with you that DataSet.Dispose does nothing and is just a side effect of inheritance.
 
As for me I never call Dispose on a DataSet.