<!-- language-all: lang-java -->

#Java, <s>209</s> <s>207</s> <s>195</s> 191 bytes

I'm surprised I was able to get it this short. There is probably still room for improvement. As usual, suggestions will be appreciated :)

This returns a `char[]`. Call using `a(n)`.

    char[]a;int b,c,d,e=2;char[]a(int f){java.util.Arrays.fill(a=new char[b=1<<f],'.');for(a[0]=88;d+1<e;c=(d+e)/2,a[c%b]=88)e=b(d=b(b(c)));return a;}int b(int f){for(;;)if(a[++f%b]>87)return f;}

Indented:

    char[] a;
    int b, c, d, e = 2;

    char[] a(int f){
        java.util.Arrays.fill(
                a = new char[
                        b = 1 << f
                        ]
                , '.'
        );
        for(
                a[0] = 88;
                d + 1 < e;
                    c = (d + e) / 2,
                    a[c % b] = 88
            )
            e = b(
                    d = b(
                            b(c)
                    )
            );
        return a;
    }

    int b(int f){
        for (;;)
            if (a[++f % b] > 87)
                return f;
    }

12 bytes thanks to Peter :)  
4 bytes thanks to TNT ;)