1) File.ReadAllLines выполняет File.Close, поэтому у вас не должно быть проблем с потоком.
2) Вам нужно поместить свой запрос Linq в декларацию XElement, чтобы получить из нее XElement, а не IEnumerable из XElements (см. Ниже)
3 & 4 кто-то другой может ответить ...;)
(Предупреждение, следующий код не проверен) :
var xmlFile = new XElement("root",
from line in File.ReadAllLines(@"d:\sample.txt")
where !line.StartsWith("#") && line.Length>0
let parts=line.Split(',')
select new XElement("book",
new XElement("ISBN",parts[0]),
new XElement("Title",parts[1])
)
);