A: 

First, I'll recommend testing out different possibilities using LINQPad, which is free and awesome.

I can't quite remember what you can do from the table adapter, but you should be able to use the DataSet to get at the data you want, e.g.

string spec = myDataSet.MyTable.Rows[0] // or FindBy... or however you are choosing a row
    .Specification;

So you might be able to do

foreach(var row in myDataSet.MyTable.Rows) {
    string spec = row.Specification;
    ...
}

Or

return (from row in myDataSet.Specification
    select new ClassSpecification()
    {
        Specification = row.Specification,
        SpecificationType = row.SpecificationType,
        StatusChange = row.StatusChange,
        Spec = row.Spec,
    }).ToList<ClassSpecification>();

Or even

return myDataSet.Specification.Cast<ClassSpecification>()

Not sure if the last one will work, but you can see that there are several ways to get what you want. Also, in my tests the row is strongly typed, so you shouldn't need to create a new class in which to put the data - you should just be able to use the existing "SpecificationRow" class. (In fact, I believe that this is the anemic domain model anti-pattern.)

Pat
A: 

So are you using a dataset for lack of a Linq provider to the database? That is the only reason I would consider this move. For instance, with Linq to Sql you can drag the table out and drop it. Then you have instant objects with the shape you want for it.

Kirk