@Revitalizer: you are right that there is no direct way to get to hatch lines. However we have just about enough information to construct them.
I had a hunch, that the reference to the surface and to the hatch lines are related. For the Reference.ConvertToStableRepresentation() you get:
Surface: 926c1621-1982-4ef6-bcbc-21fe350f0087-001f2d0b:1:SURFACE
Hatch Line: 926c1621-1982-4ef6-bcbc-21fe350f0087-001f2d0b:1:SURFACE/6
So given a StableRepresentation of a surface , you can construct a Reference to a hatch line with
Reference HatchRef = Reference.ParseFromStableRepresentation(doc, StableRepresentation of Surface + "/index"), where index is an integer >1
The indices are distributed over the different Hatch Lines as follows:

Take 2 references to a HatchLine and you can create a dimension. Once you have the dimension, you can determine the direction and position of the "unbound"lines.
Here is my code the create that dimension:
Floor _floor;
Reference top = HostObjectUtils.GetTopFaces(_floor).First();
PlanarFace topFace = _floor.GetGeometryObjectFromReference(top) as PlanarFace;
//check for model surfacepattern
Material mat = doc.GetElement(topFace.MaterialElementId) as Material;
FillPatternElement patterntype = doc.GetElement(mat.SurfacePatternId) as FillPatternElement;
if (patterntype== null) return Result.Failed;
FillPattern pattern = patterntype.GetFillPattern();
if (pattern.IsSolidFill || pattern.Target == FillPatternTarget.Drafting) return Result.Failed;
// get number of gridLines in pattern
int _gridCount = pattern.GridCount;
// construct StableRepresentations and find the Reference to HatchLines
string StableRef = top.ConvertToStableRepresentation(doc);
ReferenceArray _resArr = new ReferenceArray();
for (int ip = 0; ip < 2; ip++)
{
int index = 1 + (ip * _gridCount *2);
string StableHatchString = StableRef + string.Format("/{0}", index);
Reference HatchRef = null;
try
{
HatchRef = Reference.ParseFromStableRepresentation(doc, StableHatchString);
}
catch
{ }
if (HatchRef == null) continue;
_resArr.Append(HatchRef);
}
// 2 or more References => create dimension
if (_resArr.Size>1)
{
using (Transaction t = new Transaction(doc,"dimension Hatch"))
{
t.Start();
Dimension _dimension = doc.Create.NewDimension(doc.ActiveView, Line.CreateBound(XYZ.Zero, new XYZ(10, 0, 0)), _resArr);
// move dimension a tiny amount to orient the dimension perpendicular to the hatchlines
// I can't say why it works, but it does.
ElementTransformUtils.MoveElement(doc, _dimension.Id, new XYZ(.1, 0, 0));
t.Commit();
}
}