C, 373 bytes
g(char*y){printf("%s, ",y);}z(char*w){int i,k=-1,v=0,j=sizeof(c)/sizeof(c[0]);int m[j],b=0;for(i=0;i<j;i++){m[v++]=c[i][0]==w[strlen(w)-1]?2:1;if(u[i]==6)m[v-1]=1;if(strcmp(w,c[i]))k=i;}printf("%s",w);for(i=0;i<j;i++){if(m[i]!=1){if(v+i!=j){g(s);for(;b<j;b++){if(u[b]==6)g(c[b]);}}else printf(", ");u[i]=6;z(c[i]);u[i]=1;}else v+=-1;}if(k!=-1)u[k]=1;if(v==0)printf(" ; ");}
I believe there is probably a lot more golfing I could do here so I will probably update it.
De-golf
char *c[9]={"cat","today","yoda","artistic","cute","ewok","kilo","to","otter"};
u[9]={-1};
char *s="attic";
g(char*y){printf("%s, ",y);}
z(char*w){
int i,k=-1,v=0,j=sizeof(c)/sizeof(c[0]);
int m[j],b=0;
for(i=0;i<j;i++){
m[v++]=c[i][0]==w[strlen(w)-1]?i:-1;
if(u[i]==6)m[v-1]=-1;
if(strcmp(w,c[i]))k=i;
}
printf("%s",w);
for(i=0;i<j;i++){
if(m[i]!=-1){
if(v+i!=j){
g(s);
for(;b<j;b++){
if(u[b]==6)g(c[b]);
}
}else printf(", ");
u[i]=6;
z(c[i]);
u[i]=-1;
} else v+=-1;
}
if(k!=-1)u[k]=-1;
if(v==0)printf(" ; ");
}
main(){
z(s);
printf("\n");
return 0;
}
Ideone link - If I didn't do this right just let me know :D