Chain words crossword-style The challenge

Given a list of words ["Programming", "Puzzles", "Code", "Golf"] output the words crossword-style:


      P r o g r a m m i n g
      u
      z
      z
  G   l
C o d e
  l   s
  f


The Algorithm


You have to process the list in the given order.
The words are printed in alternating orientations, starting horizontally.
The two words intersect at the first letter in the first word which is also present in the second word. If this letter occurs multiple times in the seond word, take the first one.

Example:
["no", "on"] becomes:

o
n o


and not 

n o
  n



Additional notes


Adjacent words in the list will have at least one common letter. ["Hi", "there"] is not a valid input.
Words will never collide. There will always be enough space to print the a word at the first possible intersection. ["Hello", "there", "end", "hello"] is not a valid input
The matching is case-sensitive.
Words can expand to the left and to the top.
The letters of the horizontal words have to be separated by one space.
The input list will contain at least two words.
All words will match the regex: [A-Za-z]+
You may print as many trailing whitespaces or newlines as you want, as long as the words are correctly chained.
On the other hand you may not add additional leading whitespaces. The word which floats to the left the most has zero leading spaces, the other lines have so many leading spaces that it all lines up correctly.
You program has to be able to deal with an arbitrary amount of words


Rules


Function or full program allowed.
Default rules for input/output.
Standard loopholes apply.
This is code-golf, so lowest byte-count wins. Tiebreaker is earlier submission.


Test cases

Input list on the first line, output starts on the second line.


["Stack", "Exchange"]
    E
    x
    c
    h
S t a c k
    n
    g
    e



["This", "site", "graduated", "finally"]
    f
    i       s
    n   T h i s
g r a d u a t e d
    l       e
    l
    y






Happy Coding!
ANSI C, 385 390 Characters

int N,a=1,x,y,d=1,u,k,l;int main(int c,char**v){for(;a&lt;c;)N+=strlen(v[a++]);int H=N*2,W=N*4,m=H,n=N,q=m,w=n;char*p,F[W][H],*o;memset(F,32,W*H);for(a=1;a&lt;c;a++){q=(x=m)&lt;q?m:q;w=(y=n)&lt;w?n:w;m=-1;for(p=v[a];*p;p++){F[x][y]=*p;if(m&lt;0&amp;&amp;a&lt;c-1&amp;&amp;(o=strchr(v[a+1],*p))){u=o-v[a+1];m=d?x:x-u*2;n=d?y-u:y;}if(d)x+=2;else y++;}d=!d;}for(l=w;l&lt;H;l++){for(k=q;k&lt;W;)putchar(F[k++][l]);putchar(10);}}


Call it like this: ./crossword This site graduated finally

Ungolfed version:

int N,a=1,x,y,d=1,u,k,l;
int main(int c, char **v) {
    for(;a&lt;c;)
        N+=strlen(v[a++]);
    int H = N*2, W = N*4, m = H, n = N, q=m, w=n;
    char *p,F[W][H], *o;
    memset(F, 32, W*H);
    for (a=1; a &lt; c; a++) {
        q=(x=m)&lt;q?m:q;
        w=(y=n)&lt;w?n:w;
        m=-1;
        for (p=v[a]; *p; p++) {
            F[x][y] = *p;
            if (m&lt;0&amp;&amp;a&lt;c-1&amp;&amp;(o = strchr(v[a+1], *p))) {
                u = o-v[a+1];
                m = d ? x : x-u*2;
                n = d ? y-u : y;
            }
            if (d) x+=2; else y++;
        }
        d=!d;
    }
    for (l = w; l &lt; H; l++) {
        for (k = q; k &lt; W;)
            putchar(F[k++][l]);
        putchar(10);
    }
}


Thank you tucuxi for the tips!